#ifndef CIRCLE_H
#define CIRCLE_H

/**
 * \file Circle.h
 * \brief Fichier contenant la dclaration de la classe Circle
 */

#include <math.h>
#include "Point.h" 

class Circle
{
	/* \class Circle
	 * \brief Cette classe reprsente un cercle dans l'espace de Hough.
	 */
	private :

        float A;	/*!<Coordonne X du centre du cercle.*/
        float B;	/*!<Coordonne Y du centre du cercle.*/
        float R;	/*!<Rayon du cercle.*/

	public :

		/*!
		 *  \brief Constructeur de la classe Circle
		 *
		 *  Constructeur par dfaut de la classe Circle
		 */
        Circle(void);

		/*!
		 *  \brief Constructeur de la classe Circle
		 *
		 *  Constructeur de la classe Circle
		 *
		 * \param _a : Coordonne X du centre du cercle.
		 * \param _b : Coordonne Y du centre du cercle.
		 * \param _r : Rayon du cercle.
		 */
        Circle(float _a, float _b, float _r);

		/*!
		 *  \brief Constructeur de la classe Circle
		 *
		 *  Constructeur de la classe Circle.
		 *	Permet de construire un cercle  partir de trois points dans l'espace 
		 *
		 * \param _p1 : Premier point appartenant au cercle.
		 * \param _p2 : Deuxime point appartenant au cercle.
		 * \param _p3 : Troisiem point appartenant au cercle.
		 */
		Circle(Point _p1, Point _p2, Point _p3);

		/*!
		 *  \brief Constructeur de la classe Circle
		 *
		 *  Constructeur de copie de la classe Circle
		 *
		 * \param _c : Cercle  copier.
		 */
        Circle(const Circle & _c);

		/*!
		*  \brief Destructeur de la classe Circle
		*
		*  Destructeur de la classe Circle
		*/
        ~Circle();

		/*!
		 *  \brief Modificateur de la classe Circle
		 *
		 *  Modificateur de la classe Circle
		 *
		 *	\param _a : Coordonne X du centre du cercle.
		 *	\param _b : Coordonne Y du centre du cercle.
		 *	\param _r : Rayon du cercle.
		 *  \return : void
		 */
		void setABR(float _a, float _b, float _r);
       
		/*!
		 *  \brief Accesseur de la classe Hough
		 *
		 *  Accède à A
		 *
		 * \return : Coordonne X du centre du cercle.
		 */
        float getA(void);

		/*!
		 *  \brief Accesseur de la classe Hough
		 *
		 *  Accède à B
		 *
		 * \return : Coordonne Y du centre du cercle.
		 */
        float getB(void);

		/*!
		 *  \brief Accesseur de la classe Hough
		 *
		 *  Accède à R
		 *
		 * \return : Rayon du cercle.
		 */
        float getR(void);

		/*!
		 *  \brief Affiche le cercle dans l'espace.
		 *
		 *  Affiche le cercle reprsent par A, B et R dans l'espace.
		 *	Le cercle est inscrit dans un plan horizontal.
		 *
		 *	\param _z : altitude du cercle.
		 *  \return : void
		 */
		void draw( float _z = 0.0 );
		
		/*!
		 *  \brief Affiche le cercle dans l'espace en couleur choisie.
		 *
		 *  Affiche le cercle reprsent par A, B et R dans l'espace en couleur.
		 *	Le cercle est inscrit dans un plan horizontal.
		 *
		 *	\param _z : altitude du cercle.
		 *	\param _r : canal rouge de la couleur à afficher.
		 *	\param _g : canal vert de la couleur à afficher.
		 *	\param _b : canal bleu de la couleur à afficher.
		 *  \return : void
		 */
		void draw( float _z, float _r, float _g, float _b );
		
		/*!
		 *  \brief Affiche les attributs du cercle dans la console.
		 *
		 *  Affiche les attributs du cercle dans la console.
		 *
		 *  \return : void
		 */
		void print();

		/*!
		 *  \brief Calcule si deux cercles s'intersectent.
		 *
		 *  Caclule si le cercle s'intersecte avec le cercle passé en paramètre.
		 *
		 *	\param _c : Cercle dont on teste l'intersection avec le cercle courant.
		 *  \return : bool
		 */
		bool intersect(Circle _c);
		
		/*!
		 *  \brief Calcule si deux cercles s'intersectent.
		 *
		 *  Caclule si le cercle s'intersecte, coupe, ou non, le cercle passé en paramètre.
		 *
		 *	\param _c : Cercle dont on teste l'intersection avec le cercle courant.
		 *  \return : Renvoie 1 si les cercles se coupent, 0 si l'un est inscrit dans l'autre et -1 sinon.
		 */
		int conflict(Circle _c);

};

#endif

